Objetivo
Diseñar e implementar un módulo que, dado el contenido de la charla (campo contenido_charla
de subtemas_curso
) y considerando los antecedentes académicos personales de los postulantes (tabla profesores
y sus profesor_documentos
), calcule un porcentaje de cumplimiento y entregue un informe HTML completo con ranking y evidencias, almacenando un histórico de evaluaciones por subtema.
Decisión clave La profesión esperada se fija en subtemas_curso.especialista
. No se modifica perfil_especialista_json
(solo como antecedente si se consulta).
Alcance
- Entrada:
subtemas_curso
(usacontenido_charla
) y tablas deprofesores
+profesor_documentos
. - Postulantes: <= 10; Documentos: ~2 por postulante.
- Idioma: Español.
- Sin eliminatorios: se usa umbral de cumplimiento (inicial: 60%), configurable.
- Citas: solo nombre de archivo (no se requiere página).
- Salida: Informe HTML + registro histórico en una tabla dedicada.
Arquitectura lógica (alto nivel)
- Módulo Configuración: parámetros ajustables (umbral, pesos de score, catálogo de profesiones/sinónimos).
- Módulo Clasificación de charla: resume el temario y sugiere profesión esperada; se escribe en
subtemas_curso.especialista
. - Módulo Matching: normaliza
profesores.especialidad
y cruza conespecialista
del subtema. - Módulo Evidencias: lectura de
profesor_documentos
, extracción de fragmentos relevantes, armado de citas (archivo + snippet). - Módulo Scoring: calcula match% (Cobertura 45, Experiencia 35, Actualidad 10, Comunicación 10 —configurable).
- Generador de Informe: compone HTML con ranking, evidencias y brechas.
- Histórico: persiste informe y resultados por subtema.
- Backend: PHP (controladores + servicios).
- AI: API Gemini para clasificación, resumen y evaluación dirigida (instrucciones estrictas de citar solo con nombre de archivo).
- Almacenamiento: BD existente + nueva tabla
subtema_evaluacion_hist
. - Acceso Documentos: rutas locales accesibles (mismo host).
- Seguridad: acceso autenticado a informes y documentos.
Modelo de datos (existente y nuevo)
Tablas existentes (resumen funcional)
Tabla | Uso en flujo | Campos relevantes |
---|---|---|
subtemas_curso |
Fuente del temario; escritura de especialista . |
id , titulo , contenido_charla (temario), especialista (profesión esperada), perfil_especialista_json (solo antecedente). |
profesores |
Catálogo de postulantes y su especialidad declarada. | id , rut , nombre , apellidos , correo , telefono , ciudad , region , especialidad , cv_resumen , foto_perfil . |
profesor_documentos |
Fuentes de evidencia para cada postulante. | id_documento , profesor_id , nombre_documento , ruta_archivo , tipo , descripcion , fecha_doc , modo . |
Nueva tabla: histórico de evaluaciones
Se centraliza en una única tabla para mantener el rastro completo (informe HTML, parámetros, resultados y seleccionados).
Campo | Tipo sugerido | Descripción |
---|---|---|
id | PK, BIGINT | Identificador único de la evaluación. |
subtema_id | FK → subtemas_curso.id | Subtema evaluado. |
fecha_evaluacion | DATETIME | Fecha/hora de la ejecución. |
umbral_utilizado | DECIMAL(5,2) | Ej.: 60.00. |
profesion_esperada | VARCHAR(160) | Copia del valor vigente en subtemas_curso.especialista . |
parametros_json | JSON | Peso de dimensiones, catálogo activo, etc. |
resumen_scores_json | JSON | Lista: [{id_profesor, match, dimensiones:{...}}] (todos los evaluados). |
postulantes_seleccionados | JSON | IDs de seleccionados (≥ umbral) en orden. |
brechas_json | JSON | Checklist de “faltaría saber” por seleccionado. |
informe_html | LONGTEXT | Informe completo renderizable. |
autor | VARCHAR(120) | Usuario que ejecutó (opcional). |
hash_fuente | VARCHAR(64) | Huella de contenido_charla (opcional) para trazabilidad. |
Si en el futuro prefieres normalizar seleccionados a tabla hija, se crea subtema_evaluacion_seleccionado
(1:N).
Parámetros de Configuración (ajustables)
- Umbral: 60% (por defecto), rango sugerido 50–80%.
- Pesos del Match Global: Cobertura 45, Experiencia 35, Actualidad 10, Comunicación 10.
- Catálogo de profesiones: lista de valores estándar y sinónimos para normalizar
profesores.especialidad
. - Máximo de evidencias por candidato: 3–8 (para informe legible).
- Longitud de snippet: 140–280 caracteres.
- Modo de cita: solo nombre de archivo.
- Idioma: ES (entrada/salida).
- Riesgo por antigüedad: marcar evidencia si todo es anterior a N años (opcional, ej. 3).
Flujos funcionales
F1. Preparar profesión esperada del subtema
- Seleccionar subtema en la UI.
- Leer
contenido_charla
. - Resumir y clasificar (Gemini) para sugerir profesión/subárea.
- Aprobar en UI y escribir en
subtemas_curso.especialista
.
F2. Filtrar postulantes compatibles
- Tomar
especialista
del subtema. - Normalizar
profesores.especialidad
contra catálogo (sin tocar BD). - Filtrar candidatos cuyo mapeo sea compatible.
- Listar candidatos preseleccionados.
F3. Extraer evidencias por candidato
- Obtener documentos desde
profesor_documentos
porprofesor_id
. - Leer cada archivo (CV/títulos/certificados/otros).
- Buscar señales de: Cobertura temática, Experiencia aplicada, Actualidad, Comunicación.
- Guardar evidencias como:
{archivo, snippet}
.
F4. Calcular Match %
- Calcular puntajes por dimensión (0–100).
- Aplicar pesos configurados → match_global.
- Generar “Faltaría saber” (brechas) para llegar a 100%.
F5. Generar informe HTML y guardar histórico
- Ordenar por
match_global
. - Componer el informe HTML (cabecera de charla, resumen, detalle por candidato ≥ umbral, anexo opcional).
- Persistir en
subtema_evaluacion_hist
con parámetros y resultados. - Exponer enlace/descarga del informe.
Endpoints y responsabilidades (sin código)
Endpoint | Entrada | Salida | Responsabilidad |
---|---|---|---|
POST /config |
JSON: umbral, pesos, catálogo profesiones. | 200 OK | Guardar parámetros (persistir en tabla propia o archivo seguro). |
POST /subtemas/:id/clasificar |
ID subtema. | Profesión esperada (texto) + sugerencias. | Clasificar con Gemini y escribir en subtemas_curso.especialista tras confirmación. |
POST /evaluar |
subtema_id | Informe HTML + resumen JSON | Matching, extracción de evidencias, scoring, generación de HTML y guardado en histórico. |
GET /historial/:subtema_id |
subtema_id | Lista de evaluaciones previas | Recuperar versiones previas (fecha, umbral, seleccionados, enlace a informe). |
GET /informe/:eval_id |
eval_id | HTML | Servir el HTML guardado en histórico. |
Reglas de evaluación
- Cobertura temática: proporción de subtemas del temario mencionados en documentos (evidencias citadas).
- Experiencia aplicada: presencia de casos, proyectos, docencia o publicaciones alineadas con el temario.
- Actualidad: evidencia reciente vs. antigüedad máxima configurable.
- Comunicación: menciones a charlas/talleres/docencia.
- Brechas (“faltaría saber”): subtemas o pruebas faltantes; redactado claro y accionable.
Privacidad y cumplimiento
- Analizar solo contenido profesional; evitar atributos sensibles.
- Restringir acceso a informes y documentos a usuarios autenticados/autorizados.
- Registrar auditoría mínima: usuario ejecutor, fecha y subtema.
- Incluir en informe solo citas necesarias (archivo + snippet) sin datos excesivos.
Plan de pruebas
- Conjunto dorado: 3–5 subtemas + 6–10 postulantes con 2 docs c/u.
- Validación manual: revisar que cada evidencia realmente existe en el archivo citado.
- Pruebas de umbral: 50%, 60%, 70% para observar variación de seleccionados.
- Stress: documentos escaneados/ruidosos; ausencia de evidencia reciente.
- Regresión: si cambian pesos o catálogo, comparar resultados.
Cronograma detallado (hit-list ejecutable)
El cronograma asume 2–3 semanas con un equipo pequeño. Ajustar según tiempos internos.
Fase | Tareas concretas | Entregables | Responsable | Duración |
---|---|---|---|---|
0. Arranque |
|
Documento de catálogo; registro de parámetros. | PM + Dev | 1–2 días |
1. Clasificación |
|
Profesión esperada fijada por subtema. | Dev | 2–3 días |
2. Matching |
|
Listado de preseleccionados. | Dev | 1–2 días |
3. Evidencias |
|
Repositorio de evidencias por candidato. | Dev | 2–3 días |
4. Scoring |
|
Scores por candidato + brechas. | Dev | 1–2 días |
5. Informe & Histórico |
|
Informe HTML almacenado y consultable. | Dev | 2 días |
6. Pruebas & Cierre |
|
Go-live controlado. | PM + Dev | 2–3 días |
Criterios de aceptación
- Para un subtema dado, se fija
especialista
y se obtiene una lista de candidatos con match %. - El informe HTML muestra solo quienes ≥ umbral (configurable) y expone evidencias con nombre de archivo.
- Se guarda un registro en
subtema_evaluacion_hist
con parámetros, resultados y el HTML exacto. - Un usuario autorizado puede consultar histórico por subtema y abrir el informe.
Riesgos y mitigaciones
- Especialidad libre: inconsistencias → normalización por catálogo y sinónimos.
- Evidencia escasa: pocos documentos → enfatizar “faltaría saber”.
- Contenido antiguo: sin recencia → marcar como brecha.
- OCR: si hubiera escaneos → permitir carga manual de texto alternativo.